package com.chukun.interview.feature.textblock;

/**
 * @author chukun
 * @version 1.0.0
 * @description java新特性: 文字块
 *    文字块在 JDK 15 正式发布
 *
 * @createTime 2022年06月05日 19:54:00
 */
public class TextBlockTemplate {

    public static void main(String[] args) {

        // 这样的字符串不好写，不好看，也不好读
        String basicBlock =
                "<!DOCTYPE html>\n" +
                        "<html>\n" +
                        "    <body>\n" +
                        "        <h1>\"Hello World!\"</h1>\n" +
                        "    </body>\n" +
                        "</html>\n";

        System.out.println("基本字符串: \n" + basicBlock);

        // 新特性文字块
        /**
         * 换行字符（\n）没有出现在文字块里
         * 连接字符（+）没有出现在文字块里
         * 双引号没有使用转义字符（\）。
         * 文字块的内容并没有计入缩进空格。文字块是怎么处理缩进空格的呢?
         *
         *像传统的字符串一样，文字块是字符串的一种常量表达式。不同于传统字符串的是，在编译期，文字块要顺序通过如下三个不同的编译步骤：
         *  1、为了降低不同平台间换行符的表达差异，编译器把文字内容里的换行符统一转换成 LF（\u000A）
         *  2、为了能够处理 Java 源代码里的缩进空格，要删除所有文字内容行和结束分隔符共享的前导空格，以及所有文字内容行的尾部空格
         *  3、最后处理转义字符，这样开发人员编写的转义序列就不会在第一步和第二步被修改或删除。
         */
        String textBlock01 = """
                <!DOCTYPE html>        
                <html>            
                    <body>                
                        <h1>"Hello World!"</h1>            
                    </body>       
                </html>
                """;

        System.out.println("jdk15新特性文字块:\n" + textBlock01);


        /**
         * 把结束分隔符单独放在一行，和文本内容左边对齐。这时候，共享的前导空格就是文本内容本身共享的前导空格；结束分隔符仅仅是用来结束文字块的
         */
        String textBlock02 = """
        ********<!DOCTYPE html>
        ********<html>
        ********    <body>
        ********        <h1>"Hello World!"</h1>!!!!
        ********    </body>
        ********</html>
        ********""";

        System.out.println("删除共享前导空格: textBlock02: \n" + textBlock02);

        /**
         * 把结束分隔符单独放在一行，但是放在比文本内容更靠左的位置。这时候，结束分隔符除了用来结束文字块之外，还参与界定共享的前导空格
         */
        String textBlock03 = """
        ****    <!DOCTYPE html>
        ****    <html>
        ****        <body>
        ****            <h1>"Hello World!"</h1>!!!!
        ****        </body>
        ****    </html>
        ****""";
        System.out.println("删除共享前导空格: textBlock03: \n" + textBlock03);

        /**
         * 把结束分隔符单独放在了一行，但是放在文本内容左对齐位置的右侧。这时候，结束分隔符的左侧，除了共享的前导空格之外，还有多余的空格
         */
        String textBlock04 = """
        ********<!DOCTYPE html>
        ********<html>
        ********    <body>
        ********        <h1>"Hello World!"</h1>!!!!
        ********    </body>
        ********</html>
        ********!!!!""";

        System.out.println("删除共享前导空格: textBlock04: \n" + textBlock04);

    }
}
